/*
给定一个包含 m x n 个元素的矩阵（m 行, n 列），请按照顺时针螺旋顺序，返回矩阵中的所有元素。

示例 1:

输入:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
输出: [1,2,3,6,9,8,7,4,5]
示例 2:

输入:
[
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]
]
输出: [1,2,3,4,8,12,11,10,9,5,6,7]

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/spiral-matrix
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/

// town 2020.8.12
class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> res;
        if(matrix.empty()){
            return res;
        }
        int circle=0;
        int m= matrix.size();
        int n= matrix[0].size();
        while(true){
            //上行
            for(int i=circle;i<n-circle;i++){
                res.push_back(matrix[circle][i]);
            }
            if(res.size()==m*n){
                break;
            }

            //右列
            for(int i=circle+1;i<m-circle;i++){
                res.push_back(matrix[i][n-1-circle]);
            }
            if(res.size()==m*n){
                break;
            }

            //下行
            for(int i=n-1-circle-1;i>=circle;i--){
                res.push_back(matrix[m-1-circle][i]);
            }
            if(res.size()==m*n){
                break;
            }

            //左列
            for(int i=m-1-circle-1;i>circle;i--){
                res.push_back(matrix[i][circle]);
            }
            if(res.size()==m*n){
                break;
            }
            circle++;
        }
        return res;
    }
};